package com.mzz.creational.singleton;

/**
 * 建议采取该方式 (静态域)
 * (5) 常用  静态类部类 模式   －－－－ > 遇到对象序列化式，则不是单例，是多例   需要重新 readObject()  方法，返回该方法的实例
 *
 * @describe 描述：这种方式能达到双检锁方式一样的功效，但实现更简单。对静态域使用延迟初始化，应使用这种方式而不是双检锁方式。
 *
 *          这种方式只适用于静态域的情况，双检锁方式可在实例域需要延迟初始化时使用。 这种方式同样利用了 classloder 机制来保证初始化
 *           instance 时只有一个线程，它跟第 4 种方式不同的是：第 4 种方式只要 Singleton 类被装载了，那么
 *           instance 就会被实例化（没有达到 lazy loading 效果），
 *
 *
 *
 *           1.懒加载 2.Singleton 未在加载式实例化
 *
 *           而这种方式是 Singleton类被装载了，instance 不一定被初始化。 因为 SingletonHolder
 *           类没有被主动使用，只有显示通过调用 getInstance 方法时，才会显示装载 SingletonHolder 类， 从而实例化
 *           instance。想象一下，如果实例化instance 很消耗资源，所以想让它延迟加载， 另外一方面，又不希望在 Singleton
 *           类加载时就实例化，因为不能确保 Singleton 类还可能在其他的地方被主动使用从而被加载，那么这个时候实例化 instance
 *           显然是不合适的。这个时候，这种方式相比第 4 种方式就显得很合理。
 *
 * @author xushijian
 *
 */
public class SingletonStaticInner5 {

    private static class SingletonHolder {
        /**
         * 由Java虚拟机来保证其线程安全性，确保该成员变量只能初始化一次。
         */
        public static final SingletonStaticInner5 INSTANCE = new SingletonStaticInner5();
    }

    private SingletonStaticInner5() {

    }

    public static final SingletonStaticInner5 getInstance() {
        return SingletonHolder.INSTANCE;
    }

}
